Особенности использования метода ДанныеСтроки()

Табличное поле предоставляет свойства "ТекущиеДанные", "ТекущаяСтрока", а также метод ДанныеСтроки(). Свойство "ТекущиеДанные" содержит значения считанных данных текущей строки табличного поля, а свойство "ТекущаяСтрока" содержит значение, идентифицирующее строку. Следует отметить, что свойство "ТекущиеДанные" содержит  коллекцию значений текущей строки, соответствующую коллекции колонок отображаемого динамического списка. Метод "ДанныеСтроки" возвращает коллекцию значений произвольной строки динамического списка, отображаемого табличным полем. При этом возвращаемая коллекция значений также соответствует коллекции  колонок отображаемого динамического списка.

Метод "ДанныеСтроки" может использоваться для обхода различных коллекций строк табличного поля (например, коллекции выделенных строк при множественном выделении или массива строк, полученного при перетаскивании данных из одного табличного поля в другое). Также данный метод можно использовать для проверки возможности вставки данных в табличное поле при перетаскивании.

Поясним использование данного метода на следующем примере. Пусть существует форма подбора номенклатуры, на которой расположено табличное поле, отображающее справочник номенклатуры. Требуется осуществлять подбор номенклатуры из данного табличного поля, причем, подбирать можно только те строки, у которых не установлена пометка удаления. Для упрощения примера будем осуществлять подбор только при помощи механизма перетаскивания. Для этого у табличного поля, отображающего справочник номенклатуры, необходимо установить свойство "РазрешитьНачалоПеретаскивания", а также установить режим множественного выделения строк, используя свойство "РежимВыделения". Далее, при обработке события «НачалоПеретаскивания» необходимо проверить в массиве перетаскиваемых строк (он передается через свойство «Значение» параметра "ПараметрыПеретаскивания" в обработчике события) наличие строк, помеченных на удаление и если такие строки существуют, то удалить их из массива. Пример обработчика события приведен ниже:

Копировать в буфер обмена
// Процедура обработчик события НачалоПеретаскивания элемента формы СписокНоменклатура
//
Процедура СписокНоменклатураНачалоПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка)

    Перем СтрМассива;
    Перем ДанныеСтр;
    Перем Сч;

    // Из данного табличного поля разрешено только копировать данные.
    ПараметрыПеретаскивания.ДопустимыеДействия = ДопустимыеДействияПеретаскивания.Копирование;

    // Нельзя перетаскивать строки, помеченные на удаление
    Если ТипЗнч(ПараметрыПеретаскивания.Значение) = Тип("Массив") Тогда

        // Проверить наличие в массиве строк, помеченных на удаление.
        Сч = ПараметрыПеретаскивания.Значение.Количество() - 1;
        Пока Сч >= 0 Цикл

            ДанныеСтр = Элемент.ДанныеСтроки(ПараметрыПеретаскивания.Значение[Сч]);

            // Если строка помечена на удаление или является группой, то удалить ее из массива.
            Если ДанныеСтр.ПометкаУдаления ИЛИ ДанныеСтр.ЭтоГруппа Тогда

                ПараметрыПеретаскивания.Значение.Удалить(Сч);

            КонецЕсли;

            Сч = Сч - 1;

        КонецЦикла;

        // Если массив стал пустым, то запрещаем перетаскивание.
        Если ПараметрыПеретаскивания.Значение.Количество() = 0 Тогда

            СтандартнаяОбработка = Ложь;

        КонецЕсли;

    Иначе

        // Если строка помечена на удаление, то запрещаем перетаскивание.
        ДанныеСтр = Элемент.ДанныеСтроки(ПараметрыПеретаскивания.Значение);

        Если ДанныеСтр.ПометкаУдаления Тогда

            СтандартнаяОбработка = Ложь;

        КонецЕсли;

    КонецЕсли;

КонецПроцедуры

Обход коллекции выделенных строк можно пояснить на следующем примере. Пусть существует табличное поле, отображающее список справочника "Номенклатура". Требуется сохранить в текстовом документе все выделенные строки данного справочника, причем, сохранять необходимо только значения видимых колонок табличного поля. В приведенном ниже примере запись выделенных строк осуществляется при нажатии на специальную кнопку "Записать":

Копировать в буфер обмена
Процедура КнопкаЗаписатьНажатие(Элемент)

    Перем ТекстДок;
    Перем СтрСписка;
    Перем ДанныеСтр;
    Перем ДиалогЗаписиФайла;
    Перем КолонкаТП;
    Перем СтрокаТекста;

    // Выбор имени файла для записи.
    ДиалогЗаписиФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    ДиалогЗаписиФайла.Заголовок = "Укажите имя файла";
    ДиалогЗаписиФайла.ПолноеИмяФайла = "";
    ДиалогЗаписиФайла.ПроверятьСуществованиеФайла = Истина;
    ДиалогЗаписиФайла.Фильтр = "Текстовый файл (*.txt)|*.txt";

    Если Не ДиалогЗаписиФайла.Выбрать() Тогда

        Возврат;

    КонецЕсли;

    // Создание текстового документа и добавление в него строк, не помеченных на удаление.
    ТекстДок = Новый ТекстовыйДокумент();

    Для каждого СтрСписка из ЭлементыФормы.СправочникСписок.ВыделенныеСтроки Цикл

        ДанныеСтр = ЭлементыФормы.СправочникСписок.ДанныеСтроки(СтрСписка);

        Если Не ДанныеСтр.ПометкаУдаления Тогда

            СтрокаТекста = "";

            // В текстовый документ выводятся только видимые колонки табличного поля.
            Для каждого КолонкаТП из ЭлементыФормы.СправочникСписок.Колонки Цикл

                Если КолонкаТП.Видимость И КолонкаТП.Данные <> "" Тогда

                    СтрокаТекста = СтрокаТекста + ДанныеСтр[КолонкаТП.Данные] + " ";

                КонецЕсли;

            КонецЦикла;

            ТекстДок.ДобавитьСтроку(СтрокаТекста);

        КонецЕсли;

    КонецЦикла;

    // Сохранение текстового документа.
    Попытка

        ТекстДок.Записать(ДиалогЗаписиФайла.ПолноеИмяФайла);

    Исключение

        Предупреждение("Ошибка при записи файла: " + ДиалогЗаписиФайла.ПолноеИмяФайла + Символы.ПС
            + ОписаниеОшибки() + Символы.ПС + "Файл не записан.");

    КонецПопытки;

КонецПроцедуры

Более подробно ознакомиться с особенностями реализации перетаскивания в формах можно в разделе "Особенности реализации перетаскивания в формах".